// SyncMonitor.java
package org.zjx.core.monitor;

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 同步操作监控器
 *
 * 用于监控跨域同步操作的性能指标，包括：
 * - 延迟(latency)
 * - 数据传输量(dataSize)
 *
 * 设计特点：
 * - 线程安全：使用ConcurrentHashMap和同步方法
 * - 按域(domain)分类统计
 * - 记录总延迟、总数据量和操作次数
 */
public class SyncMonitor {
    // 按域类型分类的统计信息
    private final Map<Class<?>, SyncStats> domainStats = new ConcurrentHashMap<>();

    /**
     * 记录同步操作
     * @param domainType 域类型(Class对象)
     * @param latency 操作延迟(毫秒)
     * @param dataSize 数据传输量(字节)
     */
    public void recordSync(Class<?> domainType, long latency, int dataSize) {
        // 获取或创建该域类型的统计信息
        domainStats.computeIfAbsent(domainType, k -> new SyncStats())
                .record(latency, dataSize);
    }

    /**
     * 同步统计信息内部类
     * 使用synchronized保证线程安全
     */
    private static class SyncStats {
        private long totalLatency;  // 总延迟(毫秒)
        private long totalData;     // 总数据量(字节)
        private int count;          // 操作次数

        /**
         * 记录一次同步操作
         * @param latency 操作延迟(毫秒)
         * @param dataSize 数据传输量(字节)
         */
        synchronized void record(long latency, int dataSize) {
            totalLatency += latency;
            totalData += dataSize;
            count++;
        }

        /**
         * 计算平均延迟(毫秒)
         * @return 平均延迟(毫秒)
         */
        public double getAvgLatency() {
            return count == 0 ? 0 : totalLatency / (double)count;
        }

        // Getters
        public long getTotalLatency() { return totalLatency; }
        public long getTotalData() { return totalData; }
        public int getCount() { return count; }
    }

    /**
     * 获取所有域的统计信息
     * @return 不可修改的统计信息映射
     */
    public Map<Class<?>, SyncStats> getDomainStats() {
        return Collections.unmodifiableMap(domainStats);
    }
}